package reflect;

/**
 * java反射机制
 * 反射是java的动态机制，允许程序在运行期间再确定如对象的实例化，方法的调用，属性的操作等
 * 反射机制可以提高代码的灵活性，可扩展性，但是也带来了较慢的运行效率和较多的系统开销。
 * 因此反射机制不宜过度使用
 */
public class ReflectDemo1 {
    public static void main(String[] args) {
        /*
            反射操作的第一步:获取类对象(Class的实例)
            Class类:反射对象之一
            该类的每一个实例用于表示JVM加载的一个类:JVM加载一个类的字节码文件后就会实例化
            一个Class的实例记录加载类的一切信息并与之绑定，因此在JVM内部每个被加载的类都有
            且只有一个Class的实例
            通过Class的实例就可以"反应"(reflect)出该类的一切信息:类名，包信息，注解，构造器，方法等

            获取类对象的方式:
            1:类名.class
              Class cls = String.class;
              Class cls = int.class;//基本类型也可以获取类对象，但是方式只有这一种

            2:Class.forName(String className)
              根据类的完全限定名(包名.类名)形式获取类对象
              Class cls = Class.forName("java.lang.String");

            3:类加载器获取ClassLoader
         */
        //获取String的类对象
        Class cls = String.class;

        String className = cls.getName();
        System.out.println(className);//java.lang.String
        //通过指定类的完全限定名加载类对象
        className = cls.getSimpleName();
        System.out.println(className);//String
        /*
            通过类对象反应该类的包信息
            Package的每一个实例用于表示一个包的信息
         */
        Package pack = cls.getPackage();
        //获取包名
        System.out.println(pack.getName());//java.lang
        //输出包信息
        System.out.println(pack);//package java.lang, Java Platform API Specification, version 1.8
    }
}
